package main

import (
	"fmt"
	"reflect"
	"runtime"
	"time"
)

// 案例：计算函数运行时间
func foo(t time.Duration) {
	fmt.Println("foo功能开始")
	time.Sleep(time.Second * t)
	fmt.Println("foo功能结束")
}

func bar(t time.Duration) {
	fmt.Println("bar功能开始")
	time.Sleep(time.Second * t)
	fmt.Println("bar功能结束")
}

// 闭包:是引用了自由变量（外部非全局）的函数。
func GetTimer(f func(t time.Duration)) func(t time.Duration) {

	fn := func(t time.Duration) {
		start := time.Now().Unix()
		f(t)
		end := time.Now().Unix()

		// 获取函数名
		fn := runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
		fmt.Printf("方法%s执行时间%d秒\n", fn, end-start)
	}
	return fn
}

func main() {
	// 针对foo函数的耗时统计
	foo := GetTimer(foo)
	foo(2)

	// 针对bar函数的耗时统计
	bar := GetTimer(bar)
	bar(3)
}
